package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream
 *        BufferedInputStream
 */
public class IOSAPI {

    /**
     * 缓冲输入流：构造器-->异常对象
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节的问题
     * InputStreamReader  读取单位:字符
     * OutputStreamWriter  写出单位：字符   调用
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream（低级流引用，“字符集”size:存字节数组【指定】）
     * 问题1：不能指定字符集
     * 2：不能按照字符读取
     */
    @Test
    public void testBIS() {
//        //创建低级流
//        FileInputStream fis=
//                new FileInputStream("bos.txt");
//        //创建高级流---指定字符集---缓冲不具备功能---新【转换流】
//        BufferedInputStream bos
//                =new BufferedInputStream(fis);
//
//        /**
//         * read（）-----读：一个字节，字节数组----->专门读文字
//         */
//        bos.
//
    }

    /**
     * 高级流
     * 针对缓冲输出/入功能上的限定--
     * <p>
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节的问题
     * InputStreamReader  读取单位:字符
     * OutputStreamWriter  写出单位：字符   调用字符串getBytes写出文本
     * 需求：重新写流---针对：文字   写出文本：osw.txt
     */
    @Test
    public void testOSW() throws IOException {
        //标准流：1.置空流
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        //标准流：2.捕获异常
        try {
            //创建低级流
            fos =
                    new FileOutputStream("osw.txt");
            //不考虑效率---只传输文本---字符输出流：输出单位字符形式
            //字符流：都可以在构造器第二个参数指定编码集
            osw =
                    new OutputStreamWriter(fos, "UTF8");
            //write（） 直接写出文本
            osw.write("双击");
            osw.write("666\n");
            osw.write("999");
        } catch (FileNotFoundException e) {//文件不存在
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {//字符集转换
            e.printStackTrace();
        } catch (IOException e) {//IO流异常：所有传输失败总异常
            e.printStackTrace();
        } finally {
            //关闭高级流：字符输出流
            if (osw != null)
                osw.close();


        }
    }

    /**
     * 高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     * 字符输入流  ---  单元测试：testISR()  读入  文本【字符串？】
     * 字符输出流  ---  单元测试：testOSW()  写出  文本【字符串】
     * InputStreamReader    字符输入流  不可以读入文本
     * <p>
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader  缓冲字符输入流---解决：InputStreamReader读入字节形式
     * BufferedReader 读入字符形式
     * BufferedWrite
     * 需求：ISR字符输入流读取osw.txt 文件  ？？
     * 当前代码转换为标准流IO：捕获所有异常
     * 读取每行文本？  readLine（）  提示：不为null代表文本写出
     * 写出：给老铁来个双击`·~~666  参考CV复制粘贴
     * 777
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis = new FileInputStream("osw.txt");
        //创建高级流---转换流--字符输入流，目的：指定编码集--UTF8
        InputStreamReader isr = new InputStreamReader(fis, "UTF8");
        //读 read()  问题：读入数据单位：字节，而不是字符，读字符
        //                转换流---套高级流：缓冲字符输入/出流
        //创建高级流---针对转换流中：字符输入流无法读取形式
        //                        字符的情况--缓冲字符输入流
        BufferedReader br = new BufferedReader(isr);
        /**
         * BufferedReader类
         * readLine()  读入若干字符，直到读到没有换行符为止
         */
        String line = null;
        //判断条件：文本中一直有内容 一行文本
        while ((line = br.readLine()) != null) {
            System.out.println("打印读字符串：" + line);
        }


    }

    /**
     * 作业2  ：读取ISOAPI.java文件---所有代码--写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {
        //1.创建低级流--读入---找ISOAPI.java
        FileInputStream fis = new FileInputStream("src\\main\\java\\com\\tedu\\api\\io\\IOSAPI.java");
        //路径："D:\计算机\java-api\API\src\main\java\com\tedu\api\io\IOSAPI.java"
        //2.创建高级流---读入内容是文本---转换流  ---无法读取文本【int】
        InputStreamReader isr = new InputStreamReader(fis);
        //3.创建高级流---缓冲输入流---读取文本


        BufferedReader   br = new BufferedReader(isr);
        //4.创建变量：字符串类型---保存每次读取的一行文本
        String line = null;//null代表没有内容【等同于换行】
        //5.一直读入：每行文本保存line中   ，如果line不为null，一直读
        while ((line = br.readLine()) != null) {
            System.out.println("打印读字符串：" + line);
            //关闭高级流
        }
    }

    /**BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter----高配版本输出流【字符输出流】
     * 1.高级流不能直接创建----直接创建【不需要创建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件PW.txt---文本内容，需要指定编码集：UTF8
     *
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //创建高级流
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //写出功能：print（）打印一行文本  不换行
        //        println（）打印一行文本  换行
        pw.print("我就是");
        pw.println("我的小可爱");
        pw.close();
    }
}

